#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  
#include <stdint.h>  
  
// 定义任务结构体  
typedef struct Task_Components {  
    uint16_t ItvTime;       // 运行周期（毫秒）  
    void (*callback)(void); // 回调函数  
    struct Task_Components *next; // 指向下一个任务的指针  
    uint16_t timer;         // 当前计时器  
    bool is_running;        // 标记任务是否正在运行  
} Task_Components;  
  
// 链表头指针  
Task_Components *task_head = NULL;  
  
// 任务回调函数示例  
void Task_Dispatch_H(void) {  
    printf("Executing Task H\n");  
}  
  
void Task_Dispatch_M(void) {  
    printf("Executing Task M\n");  
} 

void Task_Dispatch_L(void) {  
    printf("Executing Task L\n");  
}   
  
// 注册任务函数  
void RegisterTask(uint16_t interval, void (*callback)(void)) {  
    Task_Components *new_task = (Task_Components *)malloc(sizeof(Task_Components));  
    if (!new_task) {  
        printf("Memory allocation failed for new task!\n");  
        return;  
    }  
  
    new_task->ItvTime = interval;  
    new_task->callback = callback;  
    new_task->timer = interval;  
    new_task->is_running = false;  
    new_task->next = task_head;  
    task_head = new_task;  
}  
  
// 更新任务计时器  
void TaskMark(void) {  
    Task_Components *current = task_head;  
    while (current != NULL) {  
        if (current->timer > 0) {  
            current->timer--;  
        } else {  
            current->timer = current->ItvTime;  
            current->is_running = true;  
        }  
        current = current->next;  
    }  
}  
  
// 调度任务（执行回调函数）  
void TaskDispatcher(void) {  
    Task_Components *current = task_head;  
    while (current != NULL) {  
        if (current->is_running) {  
            current->is_running = false;  
            current->callback();  
        }  
        current = current->next;  
    }  
}  
  
// 模拟主函数  
int main() {  
    // 注册任务  
    RegisterTask(100, Task_Dispatch_H); // 每1000毫秒执行一次Task_Dispatch_H  
    RegisterTask(500, Task_Dispatch_M);  // 每500毫秒执行一次Task_Dispatch_M  
	RegisterTask(1000, Task_Dispatch_L);  // 每500毫秒执行一次Task_Dispatch_M  
  
    // 模拟定时器中断  
    for (int i = 0; i < 2600; i++) {  
        TaskMark(); // 更新计时器  
        TaskDispatcher(); // 执行到期的任务  
          
        // 假设这里有一个延时函数来模拟时间流逝  
        // delay(1000); // 注意：这里没有实际的延时函数，只是为了演示  
  
        //printf("--- End of second %d ---\n", i + 1);  
    }  
  
    // 注意：在真实的应用程序中，你需要一种机制来清理分配的内存  
    // 这里为了简单起见，我们没有实现它  
  
    return 0;  
}